package com.cskaoyan.javase.oop1._12static._2compare;

/**
 * 当我们了解static成员的特点后，静态成员和非静态成员的区别就很明显
 * 我们从以下四个角度比较（拿成员变量为例）
 *      1.成员的所属
 *          成员变量: 对象,必须创建对象,必须有对象才能使用
 *          静态成员变量: 类,依赖于类加载的过程,无需创建对象
 *
 *      2.在内存中的位置
 *          成员变量: 堆中的对象中
 *          静态成员变量: 堆上,被共享,某个类独一份
 *
 *      3.在内存中出现的时间
 *          成员变量: 必须创建对象之后才存在,类加载之后不一定有成员变量
 *          静态成员变量: 类加载之后就存在
 *              创建对象之后,也肯定存在
 *
 *      4.调用方式
 *          成员变量: 对象名点
 *          静态成员变量: 类名点
 *
 * 以上区别,最重要的就是在内存中出现时间的区别,它们的使用方式都是因为这个区别导致的
 * 了解这一点以后,静态成员方法和普通成员方法的使用区别也就很明显了
 * 主要从以下:
 *      1.在静态成员方法中,可以访问哪些东西呢?
 *          a.静态成员方法
 *          b.静态成员变量
 *          c.成员变量
 *          d.成员方法
 *       以上只能访问a和b
 *       因为静态成员方法在类加载之后就可以使用了
 *       所以这时静态成员都可以访问了
 *       但普通成员,需要创建对象,没有对象就不能访问
 *
 *      2.在成员方法中,可以访问哪些东西呢?
 *          a.静态成员方法
 *          b.静态成员变量
 *          c.成员变量
 *          d.成员方法
 *        成员方法中是隐含this传参的
 *        都已经创建对象了
 *        以上内容全部都可用了.
 *        包括构造器中,也隐含this传参
 *        所以以上内容也是皆可用的.
 *
 * @since 10:55
 * @author wuguidong@cskaoyan.onaliyun.com
 */
public class Demo {
}

class Student {
    int age;
    static String schoolInfo;

    public Student() {
    }

    public Student(int age) {
        this.age = age;
    }

    public void test() {
        System.out.println(age);
        System.out.println(schoolInfo);
        testStatic();
    }

    public static void testStatic() {
        System.out.println(schoolInfo);
        testStatic2();
        // System.out.println(age);
        // test();
    }

    public static void testStatic2() {
    }
}